/*
    C++98中的auto_ptr采用的是权限转移的思想，也就是对象独享资源，当拷贝构造或赋值的时候，权限会发生转移
    C++标准库中的auto_ptr也不是线程安全的
*/
#pragma once
#include <iostream>

namespace crawler
{
    template<class T>
    class auto_ptr
    {
    public:
        auto_ptr(T* ptr = nullptr) : _ptr(ptr)
        {}

        auto_ptr(auto_ptr<T>& ap) : _ptr(ap._ptr)
        {
            // 权限转移的思想
            ap._ptr = nullptr;
        }

        auto_ptr<T>& operator=(auto_ptr<T>& ap)
        {
            // 监测自己是否给自己赋值
            if(this != &ap)
            {
                // 释放当前管理的资源
                if(_ptr)
                    delete _ptr;
                
                // 权限转移
                _ptr = ap._ptr;
                ap._ptr = nullptr;
            }
            return *this;
        }

        ~auto_ptr()
        {
            if(_ptr)
            {
                delete _ptr;
            }
        }

        T& operator*()
        {
            return *_ptr;
        }

        T* operator->()
        {
            return _ptr;
        }

    private:
        T* _ptr;
    };
}